package com.wx.gof.pattern.behavioral.observer.push;

/**
 * @ClassName Application
 * @Author wx
 * @Description
 * 定义:
 * 观察者模式定义了一种一对多的依赖关系，让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时，
 * 会通知所有观察者对象，使它们能够自动更新自己。
 * 描述:
 * 通过对主题对象(被观察者)设置观察者进行监听，它分为推模型和拉模型两种方式,推模型是假定主题对象知道观察者需要的数据，
 * 而拉模型是主题对象不知道观察者具体需要什么数据，没有办法的情况下，干脆把自身传递给观察者，让观察者自己去按需要取值。
 * 1.推模型可能会使得观察者对象难以复用，因为观察者的update()方法是按需要定义的参数，可能无法兼顾没有考虑到的使用情况。
 * 2.而拉模型就不会造成这样的情况，因为拉模型下，update()方法的参数是主题对象本身，这基本上是主题对象能传递的最大数据集合了，
 * 基本上可以适应各种情况的需要。
 * 使用场景:
 * 1.关联行为场景,建立一套触发机制
 * 优点:
 * 1.观察者与被观察者之间建立一个抽象耦合(被观察者依赖观察者抽象-依赖是一种弱关系)
 * 2.观察者模式支持广播通信(推)
 * 缺点:
 * 1.观察者之间有过段的细节依赖，提高时间消耗-多个观察者需要遍历执行
 * 2.使用需要避免循环调用-观察者与观察者循环依赖
 * 理解:
 * 应用程序-观察者模式-推(适合触发机制场景或者监听机制场景，监听者设计模式就是观察者模式演进而来，就像广播通讯一样)
 * @Date 2018-12-14-21:04
 */
public class Application {
    public static void main(String[] agrs){
        Observer zs = new Audience("张三");
        Observer ls = new Audience("李四");
        Observerable anchor = new Anchor("陈一发","唱歌童话镇");
        anchor.registerObserver(zs);
        anchor.registerObserver(ls);
        anchor.notifyObserver();
    }
}
